package gutils

import (
	"fmt"
	"regexp"
	"strings"
	"unicode"
)

var (
	// `\s` 在 Go 的正则里只匹配 ASCII 空白字符，所以需要更全面的模式
	// `\p{Z}` 匹配所有 Unicode 空白字符（包括 \u2000, \u3000 等）
	RESpace     = regexp.MustCompile(`[\s\p{Z}]`)                                       // Empty string
	RENumber    = regexp.MustCompile(`([0-9\.]+)`)                                      // Number
	REHex       = regexp.MustCompile(`([a-fA-F0-9]+)`)                                  // Hes
	RETimeRange = regexp.MustCompile(`\d{4}-\d{2}-\d{2}(\s*) - (\s*)\d{4}-\d{2}-\d{2}`) // Date range
)

func StrDeleteSpace(str string) string {
	if str == "" {
		return str
	}

	return RESpace.ReplaceAllString(str, "")
}

func GetFirstChar(str string) string {
	if len(str) == 0 {
		fmt.Println("字符串为空")
		return ""
	}

	// 将字符串转换为rune切片，这样可以正确处理多字节字符
	runes := []rune(str)
	firstRune := runes[0]

	// 转换为小写
	return string(firstRune)

}

// ToSnakeCaseOrKebabCase 把字符串的命名给为 SnakeCase 或者 KebabCase
// 转 SnakeCase 的话, char 使用 _
// 转 KebabCase 的话, char 使用 -
func ToSnakeCaseOrKebabCase(s string, char rune) string {
	var result strings.Builder
	for i, r := range s {
		if unicode.IsUpper(r) {
			// 如果是第一个字符且为大写,则直接转换为小写
			if i == 0 {
				result.WriteRune(unicode.ToLower(r))
			} else {
				// 在大写字母前添加下划线,并将其转换为小写
				result.WriteRune(char)
				result.WriteRune(unicode.ToLower(r))
			}
		} else {
			// 其他字符直接追加到结果中
			result.WriteRune(r)
		}
	}
	return result.String()
}

// toSnakeCase 将字符串中的大写字母替换为下划线加小写字母的形式
func ToSnakeCase(s string) string {
	return ToSnakeCaseOrKebabCase(s, '_')
}

// ToKebabCase 将命名转换为 kebab-case
func ToKebabCase(s string) string {
	return ToSnakeCaseOrKebabCase(s, '-')
}

// 把第一个字母改为大写
func CapitalizeFirst(s string) string {
	if len(s) == 0 {
		return s // 如果字符串为空，直接返回
	}
	r := []rune(s)               // 将字符串转换为 rune 切片，支持多字节字符
	r[0] = unicode.ToUpper(r[0]) // 把第一个字符转为大写
	return string(r)             // 转回字符串
}

// RepeatString 函数接收一个字符串和一个数字，根据数字将字符串进行重复
func RepeatString(s string, times int) string {
	if times < 0 {
		return ""
	}
	var result strings.Builder
	for range times {
		result.WriteString(s)
	}
	return result.String()
}

// PadString 函数用于对字符串进行填充
// 参数：
//
//	s：原始字符串
//	length：目标长度
//	padChar：填充字符
//	padPosition：填充位置，可以是 "start"（开头）或 "end"（末尾）
func PadString(s string, length int, padChar rune, padPosition string) string {
	// 检查字符串长度是否已经满足要求
	if len(s) >= length {
		return s
	}

	// 计算需要填充的字符数量
	padCount := length - len(s)

	// 构造填充字符串
	padStr := strings.Repeat(string(padChar), padCount)

	// 根据填充位置进行拼接
	switch padPosition {
	case "start":
		return padStr + s
	case "end":
		return s + padStr
	default:
		return s // 如果填充位置无效，返回原始字符串
	}
}

func testPadString() {
	// 测试用例
	originalStr := "hello"
	targetLength := 10
	padChar := '-'
	padPosition := "start"

	result := PadString(originalStr, targetLength, padChar, padPosition)
	fmt.Println("Original:", originalStr)
	fmt.Println("Padded:", result)
}
